#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "constantes_et_macros.h"

#include "manipulation_ennemis.h"





/**
 * \fn void init_ennemi(struct ennemi* enn, const unsigned int id,
                               const unsigned int x, const unsigned int y,
                               const struct base_donnees* donnees)
 * \brief prepare une structure ennemi a etre introduite dans une bataille
en piochant les informations necessaires dans la base_donnees
 *
 * \param[out] enn Un pointeur vers l'ennemi a initialiser
 * \param[in] id id de l'ennemi a ajouter (position dans la liste d'ennemis de la base_donnees)
 * \param[in] x Coordonnee horizontale d'apparition de l'ennemi
 * \param[in] y Coordonnee verticale d'apparition de l'ennemi
 * \param[in] donnees L'adresse d'une base_donnees correctement remplie
 */
static void init_ennemi(struct ennemi* enn, const unsigned int id,
                 const unsigned int x, const unsigned int y,
                 const struct base_donnees* donnees)
{
    enn->coord_x = x;
    enn->coord_y = y;
    enn->id = id;
    /* on oriente les ennemis vers le bas lors de leur arrivee */
    enn->orientation = BAS;
    enn->score_charge = 0;
    enn->score_deplacement = 0;
    enn->pv = get_pv_max(donnees, enn);
    enn->en_mouvement = FAUX;
}



void init_liste_ennemis(struct liste_ennemis* liste)
{
    liste->prem = NULL;
}



void ajouter_ennemi(struct liste_ennemis* liste, const unsigned int id,
                    const unsigned int x, const unsigned int y,
                    const struct base_donnees* donnees)
{
    struct ennemi* nouvel_ennemi;
    struct ennemi* temp;

    if(!(nouvel_ennemi = (struct ennemi*)malloc(sizeof(struct ennemi))))
        exit(EXIT_MALLOC);
    if(liste->prem)
    {
        /* cas general (insertion en tete dans liste non-vide) */
        temp = liste->prem;
        liste->prem = nouvel_ennemi;
        nouvel_ennemi->suiv = temp;
        temp->prec = nouvel_ennemi;
        nouvel_ennemi->prec = NULL;
    }
    else
    {
        /* cas de la liste vide */
        liste->prem = nouvel_ennemi;
        nouvel_ennemi->suiv = NULL;
        nouvel_ennemi->prec = NULL;
    }
    init_ennemi(nouvel_ennemi, id, x, y, donnees);
}




void supprimer_ennemi(struct liste_ennemis* liste, struct ennemi* enn)
{
    if(enn->prec)
        enn->prec->suiv = enn->suiv;
    else
    {
        /* cas ou l'element a supprimer est le premier de la liste */
        liste->prem = enn->suiv;
    }
    if(enn->suiv)
        enn->suiv->prec = enn->prec;
    free(enn);
}



void detruire_liste_ennemis(struct liste_ennemis* liste)
{
    while(liste->prem)
        supprimer_ennemi(liste, liste->prem);
}



char est_vide_liste_ennemis(const struct liste_ennemis* liste)
{
    if(liste->prem)
        return FAUX;
    else
        return VRAI;
}








